﻿using System;
using System.Data;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace GUI
{
    /// <summary>
    /// Form ouvert depuis La MainForm
    /// Permet l'ajout/modification d'une catégorie (selon les données qui lui sont passées)
    /// </summary>
    public partial class CategoryEditForm : Form
    {
        private CurrencyManager cm;
        private DataRowView categoryDV;

        public CategoryEditForm(CurrencyManager cm)
        {
            InitializeComponent();
            this.cm = cm;
        }

        private void CategoryEditor_Load(object sender, EventArgs e)
        {
            PopulateAndBind();
        }

        /// <summary>
        /// Déclenché au chargement de la Form
        /// Mise en place des liaisons des données
        /// </summary>
        private void PopulateAndBind()
        {
            categoryDV = (DataRowView)cm.Current;

            txtCategoryID.DataBindings.Add("Text", categoryDV, "categoryid");
            txtCategoryName.DataBindings.Add("Text", categoryDV, "name");
            txtCategoryDescription.DataBindings.Add("Text", categoryDV, "description");
        }

        /// <summary>
        /// Valide les données entrées dans la Form
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            // TO DO trier les caractères spéciaux

            //Verification que txtCategoryName n'est pas vide
            if (txtCategoryName.Text.Trim() != "")
            {
                DataTable categoryDT= new DataTable();
                categoryDT = BU.CategoryManager.Fetch();

                //Compare la valeur entrée dans txtCategoryName avec les noms déjà présents dans la db pour empêcher les doublons (valeur Name à Unique dans la db)
                bool edit = true;
                for (int i = 0; i < categoryDT.Rows.Count; i++)
                    if (txtCategoryName.Text.ToLower() == categoryDT.Rows[i]["name"].ToString().ToLower())
                    {
                        edit = false;
                        if (categoryDV["categoryid"].ToString() == categoryDT.Rows[i]["categoryid"].ToString())
                        {
                            edit = true;
                        } 
                    }

                if (edit == false)
                {
                    MessageBox.Show("Ce nom de catégorie est déjà utilisé.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtCategoryName.Text = "";
                    txtCategoryName.Focus();
                }
                else
                {
                    cm.EndCurrentEdit();
                    DialogResult = DialogResult.OK;
                    this.Close();
                }
            }
            else
            {
                MessageBox.Show("Le nom ne peut pas être vide.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtCategoryName.Text = "";
                txtCategoryName.Focus();
            }
        }

        /// <summary>
        /// Annule les modifications apportées et renvoie DialogResult.Cancel à la MainForm (pas de modification des données)
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            cm.CancelCurrentEdit();
            DialogResult = DialogResult.Cancel;
            this.Close();
        }

        /// <summary>
        /// Permet de bien annuler les modifications entrées si l'utilisateur ferme la fenêtre non pas avec le bouton annuler mais avec la croix
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">FormClosingEventArgs e</param>
        private void CategoryEditForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            cm.CancelCurrentEdit();
        }
    }
}
